Skip to content

Combine pull requests 774, 764, 765, 773, 772 and 759 - #776

Merged
luisleo526 merged 33 commits into
mainfrom
train/engine-20261107a
Nov 7, 2026
Merged

luisleo526 merged 33 commits into
mainfrom
train/engine-20261107a

Conversation

@luisleo526

Copy link
Copy Markdown
Collaborator

Summary

This branch combines six open pull requests into one change on top of main (c6a61ef4), so that the build, the parity sweep and the review each run once. Every source head was merged with an ordinary merge commit: nothing was rebased, nothing was squashed inside the branch, no conflict occurred and nothing was resolved by hand. When this change merges, the six pull requests below are closed with a link to it.

PR type: code (engine sources, tests, CI scripts and documentation).

Sources

Pull request Title Source head
#774 Add live drawing capacity to the runtime limit vocabulary 99b0bfec50778ac90fd34b21249f15848c73815a
#764 Preserve direction in trade size accessors 834333f0174886a87eda01d4ca6175920d96563b
#765 ci: reduce sanitizer debug info footprint be68cabc6f3ff8c0171c008773ca0af28247c6d6
#773 Include ABI layout probe in PR smoke 4f31c10ce425bbc48b5affce9843968685c6b154
#772 ci: promote the engine baseline on parity alone 349418e59aa35b37c0b5b6d6979d9dbb548a9942
#759 Write bounded drawing arenas in place and share their slots between checkpoints cecedc0ef3cc7fc919ba840df0f66c23a4f74287

The head listed for #759 is that pull request's branch merged once with main; the head published on #759 is older. Draft pull request #758 is not part of this change.

How it was built

The merges were made in this order: #774 (a fast-forward, its head already contains main), then #764, #765, #773, #772 and #759. Relative to main, 54 files change. Three files are touched by two sources and merged automatically without a conflict: scripts/ci_preflight.py and scripts/test_ci_preflight.py (#772 and #773), and tests/CMakeLists.txt (#759 and #773). The result does not depend on the order: merging the same heads in the reverse order gives the identical tree. No file changes that none of the six sources changes.

What is still required before merge

CI green on this head, one parity sweep against the active baseline, one review of the combined diff that cites each source pull request, and the native live run. The results already recorded on the individual pull requests are not repeated here and do not stand in for these.

🤖 Generated with Claude Code

luisleo526 and others added 30 commits November 6, 2026 14:10
A bounded drawing arena replaces its whole state with a deep copy on every
create, delete and setter, whether or not a checkpoint shares it, so a script
that moves a few of its live drawings per bar pays O(bound) per call and the
first write after each checkpoint pays it again. The unbound arena already
shares blocks of 32 records between copies and clones only the blocks a write
reaches; this is the bounded twin of test_coof_drawing_checkpoint_cost.

The test fills an arena to its bound (100 and 1,000), then runs the scheduler's
checkpoint sequence (snapshot, restore, execute, commit) around an execution
that deletes the oldest label, creates one, moves three and changes one text,
all with texts that are never inline so a record copy allocates. Per execution
it checks that the arena shares all but a few blocks of records with its
checkpoint (the same record object through both) and that the heap blocks
allocated do not depend on the bound, that the arena equals a plain model of
the same operations after every execution, and that checkpointing an unwritten
arena allocates the same at both bounds.

The cost row is the row the change that follows must turn from red to green;
the model row and the unchanged-checkpoint row are the guards that change has
to keep green.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A bounded arena replaced its whole state with a deep copy on every create,
delete and setter: every slot, the text of every label, the directory and the
order, whether or not a script-state checkpoint still shared it. A script that
moves a few of its live drawings on every bar therefore paid time proportional
to the bound on every call, and the first write after each checkpoint paid it
again.

The slots now live in a DrawingRecordStore, the block store the unbound arena
already uses: blocks of 32 that a copy of the state shares, one path copied per
write that reaches a shared block. A copy of the state shares the blocks and
copies only the directory and the order (an integer per occupant), the
directory with room for every slot so a creation never reallocates it.
Creation, deletion and every setter give the arena a state of its own when a
checkpoint shares it, then change it in place. Each does every step that can
allocate or throw (the state's copy, the copy of the slot's block, the
directory's room, the order's growth) before its first change and only steps
that cannot throw after it, so a refused allocation leaves the arena and its
checkpoint as they were. The search for the lowest free slot starts at a
recorded index below which every slot is occupied, so slot reuse order is
unchanged and a creation no longer scans every slot.

The bound, the typed overflow outcome, the stale-handle behaviour and every
value a script reads are unchanged.

The source allocation-bound gate (ci/cr150-source-bounds.yaml) pins every
growable-container site of include/pineforge/**, so its reviewed site
inventory moves with this change: the two groups for the removed whole-state
copies are deleted and the OPEN ceiling drops by two; the groups for the slots
(a block store filled by push_back), the directory and the state's allocation
gain the new site identities. The inventory is the gate's own proposal for this
tree; its differences from the previous one are exactly those sites. The
gate's real-tree test pins the number of OPEN groups, so that pin moves by the
same two.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Main moved to the hosted verification jobs and their documentation since this
branch was cut. No file of this change is touched by those commits and no
conflict arises.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… lines

A bounded drawing arena's edits and checkpoints do no per-record work in the
bound: they copy only the blocks of 32 records they write. They do not cost
O(changes): the first write after a checkpoint still copies the slot directory
and the creation order (one 8-byte integer per occupant), and deleting the
oldest drawing moves the directory's entries. The test header and the
CHANGELOG now say so, and the test's function is renamed to match.

The source allocation-bound manifest keeps its line fields as diagnostics. The
entries of drawing.hpp that the change moved (U1665, U1669, U1670, U1671,
U1672) carry the first line the gate finds for them again. No identity changes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The CHANGELOG entry and the cost test header of the bounded drawing change said
that the first write after a checkpoint copies "one 8-byte integer per
occupant". The slot directory holds two 32-bit integers per occupant (the id and
the slot) and the creation order one 32-bit integer, so both now say "a
directory entry and an order index per occupant". Words only: no code, no
assertion and no manifest line changes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Main moved by one commit since the previous merge: the hosted sanitizer builds
get a dedicated data disk (two workflow files). No file of this change is
touched by it and no conflict arises.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Assert open and closed short accessors preserve direction from a real fill.
Report signed quantities for open and closed short trades while preserving long,
flat and bounds behavior.
The signed trade-size accessor fix intentionally removes two obsolete public statements from docs/pages/pine-to-native.md. The sentence introduced by 7328f4d is wrong after the fix because Pine's size accessor carries direction in its sign; the sentence introduced by cced2aa is the same obsolete unsigned/raw-quantity description. The replacement rows state positive long and negative short and distinguish raw magnitude fields with is_long.

Name 7328f4d and cced2aa so the doc-reverts guard can verify why those historical sentences were removed.
The accessor bodies already return signed quantities; keep each expression on one source line so the existing documentation citations remain bound to the same header and implementation lines. This preserves the exact signed-size tree behavior while removing the anchor shift.
…n moved its lines

The bounded drawing checkpoint test adds one source, test_drawing_bound_checkpoint_cost, to the TEST_SOURCES list near the top of tests/CMakeLists.txt, which moves every later line of that file by one. The evidence row for test_pooc_close_fill_view_tapes cites five of those lines: the line the sweep re-reads (3459, now 3460) and four in its reason text (:3443, :3455, :3479 and :3485-3501, now :3444, :3456, :3480 and :3486-3502). test_private_fixture_reads failed with "the token no longer sits on tests/CMakeLists.txt:3459", and test_private_fixture_reads_controls failed with it.

Only those five numbers change; the row's text is otherwise as it was. Each new line was read from the file: 3444 is the EXISTS test of a tape, 3456 the increment of _pf_pcv_emitted, 3460 the condition that is the row's token, 3480 the registration of the test, 3486 the registration of the skipped placeholder.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Use GCC minimal debug information for instrumented Debug profiles while
retaining file and line data, sanitizer flags and the full test selection.
Keep the definition below the cited profile-floor table so existing
documentation anchors remain valid.

This is a measurement step: it lowers debug info only. The pass condition
is at least 20 GB free after Verify on the worst hosted sanitizer shard.
If that margin is not reached, each shard will build only its own targets
next.
Update the margin-call twin assertion digest and register the pyramiding
partial-drain signed-size rewrite in the twin parity inventory. Recompute the
inventory hash so the guard covers both intentional assertion changes.
Build and select the existing ABI layout probe alongside the eleven existing
fast executables. Update the derived membership pin, preserve prior checks,
and exercise removal of the actual ABI row through the real workflow checker.

Documentation replacement: the sentence "names its eleven real executables;
configure refuses" now names twelve executables and explains the existing
probe's Linux x86_64 GNU libstdc++ applicability.
The ABI smoke explanation adds two documentation lines. Correct both exact
line-count expectations from 2060 to 2062 while retaining all substantive
runner, slow-inventory and same-size negative checks.
Accept live_drawings through the existing typed limit helper and publish
its English template, preserving the code identity, since value and prior
limit values. Regenerate the registry and catalog diff and exercise distinct
operator maxima through the real helper contract.
Bring the merged hosted release workflow and its CI documentation and
checks into the candidate without rewriting the existing commits.
Bring the merged hosted release workflow and its CI documentation and
checks into the candidate without rewriting the existing commits.
The merge gate now requires pineforge/parity and treats pineforge/verify
as advisory, so the promotion workflow skipped every engine merge whose
head carried no verify status. Admit on pineforge/parity success alone;
a failed or absent parity still skips.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Retain the ABI smoke selector and its tests alongside the current engine changes.
Retain the runtime limit catalog addition alongside the current engine changes.
Require the complete parity-only head predicate while preserving main-copy,
latest-status, pagination, tree, authorization and credential-order checks.
Add Bash and jq status decisions and workflow mutation controls.
Normalize enclosing parentheses around the exact parity-success expression.
Reject compound and malformed predicates, and cover parity-only, verify-only,
combined-status and missing-status cases plus expression wrapping controls.
Point seven documentation citations at the matching catalog fields after the vocabulary additions shifted their lines.
Keep the live drawing vocabulary and documentation corrections with the current cohort admission behavior.
Main now holds the cohort admission change, the run option series_origin_ms and
the other changes since the last merge. The four conflicts are mechanical:
CHANGELOG.md keeps both new entries; the unreviewed ceiling of the
allocation-bound manifest becomes 1404 (main's 1406 less the two groups this
change removes) and the gate test's pin becomes 1356 + 48 + 184; the five line
citations of the private fixture evidence row move down by the one line this
change adds to tests/CMakeLists.txt, each checked against main's line by hash.
The site inventory merged without a conflict and is checked by the gate itself.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Retain the runtime vocabulary change and the current input conversion documentation.
… accessors)

Plain merge of the source head into the combined branch; nothing was resolved by hand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…footprint)

Plain merge of the source head into the combined branch; nothing was resolved by hand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
luisleo526 and others added 3 commits November 7, 2026 22:12
…moke)

Plain merge of the source head into the combined branch; nothing was resolved by hand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…on parity alone)

Plain merge of the source head into the combined branch; nothing was resolved by hand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…place and share their slots between checkpoints)

Plain merge of the source head into the combined branch; nothing was resolved by hand. The source head is the pull request branch merged with main c6a61ef.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Worth a look — the grounded gate found no coupling regressions or blocking issues, but 1 advisory finding(s) below merit a look before merge.

Not checked: tests were not run; no formal proof of the changed code.


Graphify review — findings

Changes bounded drawing arenas (line, box, label) to write in place and keep their slots in shared blocks of 32, so a create, delete or setter copies only the blocks it writes instead of deep-copying the whole state. The first write after a checkpoint still copies the slot directory and creation order, and the bound, overflow outcome, slot reuse order and stale-handle behaviour stay the same; bound_edit now edits the state directly, which is where an edit that throws mid-write could leave it partly changed. Relaxes the baseline-promotion status gate so the engine axis admits on pineforge/parity alone, with pineforge/verify treated as advisory, and the skip notice now names only parity. A merge whose verify status is not success can now be promoted. Updates the CR150 source-bounds ledger and site inventory for the new block-shared slot storage, dropping the two whole-state copy groups and lowering the unreviewed ceiling from 1406 to 1404. Adds a changelog entry for the drawing change, along with new tests and CI preflight checks.

Worth a look

  • Baseline promotion no longer requires the pineforge/verify status — .github/workflows/promote-baseline.yml:375 · Escalate · medium
    • NOT verified (no proof, no reproducing execution) — needs human review

Review partial — this diff was larger than one review pass covers, so later files were not reviewed; some findings may be missing.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 7075 functions depend on the 4115 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: ci_workflow_findings() — 87 callers, 24 callees
  • new: run() — 1 callers, 7 callees
  • new: body() — 1 callers, 6 callees

Verification — 7075 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 7021 function(s) in the blast radius were not formally verified this run

· 2 grounded finding(s) anchored inline below; 1 more finding(s) on lines outside this diff (see the check run).

}

// ---- one script execution, on the arena and on its model ---------------------
void body(DrawingArena<LabelRec>& arena, int bar) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — body()

fans out to 6 callees (efferent coupling).

Grounded coupling-delta finding (deterministic), not an LLM guess.

bool final_state_ok = false;
};

Cost run(int bound, int executions) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — run()

fans out to 7 callees (efferent coupling).

Grounded coupling-delta finding (deterministic), not an LLM guess.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant